package com.atguigu.config;

import com.atguigu.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * Copyright 2025 ZS Network Co., Ltd. All rights reserved.
 * 本文件仅限于正数网络技术有限公司内部传阅，禁止外泄以及用于其他的商业目的。
 * Created by zwn on 2025/7/29.
 *  bean 的生命周期
 *          bean 创建-----------初始化-----------销毁的过程
 *  容器管理bean的生命周期：
 *  我们可以自定义初始化和销毁方法；容器在bean进行到当前生命周期的时候调用我们自定义的初始化和销毁方法
 *  构造（对象创建）
 *          单实例：在容器启动的时候创建对象，单实例对象容器关闭的时候销毁对象
 *          多实例：容器启动的时候不会创建对象，bean会容器关闭的时候销毁对象
 *   初始化：
 *          对象创建完成，并赋值好，调用初始化方法
 *   销毁：
 *          容器关闭的时候销毁对象
 *  1)、指定初始化和销毁方法
 *      指定@Bean initMethod和destroyMethod
 *  2)、通过让bean实现InitializingBean（定义初始化逻辑）,DisposableBean（定义销毁逻辑）
 *  3)、使用JSR250
 *          通过@PostConstruct（在bean创建完成并且属性赋值完成，来执行初始化方法）
 *          @PreDestroy（在容器销毁bean之前通知我们进行清理工作）
 *  4)、使用Spring提供的BeanPostProcessor接口:bean的后置处理器，在bean初始化前后进行拦截工作
 *      PostProcessorBeforeInitialization 在初始化之前工作
 *      PreProcessorAfterInitialization 在初始化之后工作
 *
 *      遍历得到容器中所有的BeanPostProcessor，挨个执行beforeInitialization，一旦返回null，
 *      就跳出for循环，不会执行后面的BeanPostProcessor的postProcessBeforeInitialization方法
 *      BeanPostProcessor的原理
 *      populateBean(beanName, mbd, instanceWrapper); 给Bean进行属性赋值
 *      initializeBean
 *      {
 *         applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
 *         invokeInitMethods(beanName, wrappedBean, mbdToUse);
 *         applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 *      }
 *
 *      Spring 底层对BeanProcessor 的使用
 *              Bean 赋值， 注入其他组件，@Autowired，生命周期注解功能，@AsSync XXX
 *
 * @author: zwn
 * @description:
 */
@ComponentScan("com.atguigu.bean")
@Configuration
public class MainiConfigOfLifeCycle {
   // @Scope("prototype")
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public Car getCar() {
        return new Car();
    }
}
